home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
SNNSV32.ZIP
/
SNNSv3.2
/
kernel
/
sources
/
kr_art.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-25
|
8KB
|
335 lines
/*****************************************************************************
FILE : kr_art.c
SHORTNAME :
SNNS VERSION : 3.2
PURPOSE : SNNS Kernel Functions for ART networks
NOTES :
AUTHOR : Kai-Uwe Herrmann
DATE : 17.05.92
CHANGED BY : Sven Doering
IDENTIFICATION : @(#)kr_art.c 1.7 3/15/94
SCCS VERSION : 1.7
LAST CHANGE : 3/15/94
Copyright (c) 1990-1994 SNNS Group, IPVR, Univ. Stuttgart, FRG
******************************************************************************/
#include <stdlib.h>
#ifndef NULL /* if NULL pointer is not defined include stdio.h */
#include <stdio.h>
#endif
#include "krart_df.h" /* Definitions for ART networks */
#include "kr_const.h"
#include "kr_mac.h"
#include "kr_def.h"
#include "kr_typ.h"
#include "kr_funcs.h"
#include "kernel.h"
#include "glob_typ.h"
#include "kr_art.ph"
/* declaration of module functions
*/
/**************** functions, visible to other modules **************************/
/*#################################################
GROUP: ART kernel functions
by Kai-Uwe Herrmann
#################################################*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
/* initialization of activations of all input units according to their i_act
value. this initialization is necessary each time a new pattern is
presented to the network.
*/
krui_err krart_reset_activations (void)
{
krui_err ret_code = KRERR_NO_ERROR;
struct Unit *unit_ptr;
FOR_ALL_UNITS (unit_ptr) {
if (! IS_INPUT_UNIT (unit_ptr)) {
unit_ptr->act = unit_ptr->i_act;
} /*if*/
/* The output is set for input units, too
*/
unit_ptr->Out.output = unit_ptr->act;
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* krart_reset_activations () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
/* synchronous propagation (1 cycle) i.e. each unit puts its output onto
its outgoing links and calculates its new activation.
*/
void krart_prop_synch (void)
{
struct Unit *unit_ptr;
/* calculate new activations of non input units
*/
FOR_ALL_UNITS (unit_ptr) {
if (!IS_INPUT_UNIT(unit_ptr)) {
unit_ptr->act = (*unit_ptr->act_func) (unit_ptr);
} /*if*/
} /*FOR_ALL_UNITS*/
/* set new output values
*/
FOR_ALL_UNITS (unit_ptr) {
if (unit_ptr->out_func == OUT_IDENTITY) {
unit_ptr->Out.output = unit_ptr->act;
} else {
unit_ptr->Out.output = (*unit_ptr->out_func) (unit_ptr->act);
} /*if*/
} /*FOR_ALL_UNITS*/
} /* krart_prop_synch */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
/* get the winner of the last propagation cycle. returns a pointer to
the winning recognition unit.
*/
struct Unit *krart_get_winner (TopoPtrArray wta_layer, FlintType winner_output)
/* points to first pointer to recognition unit
*/
/* output value of the winning unit */
{
TopoPtrArray topo_ptr;
struct Unit *unit_ptr,
*winner_ptr = NULL; /* points to the unit with the maximal
activation
*/
FlintType max_out = 0.0; /* contains the maximal activation
*/
topo_ptr = wta_layer;
while ((unit_ptr = *topo_ptr++) != NULL) {
if (unit_ptr->Out.output > max_out) {
max_out = unit_ptr->Out.output;
winner_ptr = unit_ptr;
continue;
} /*if*/
/* The foollowing statements assure, that a winner is returned, if
no Reset signal is sent from Reset general unit. So we will
find a winner, even if the winner unit's activation is 0.0
This is neccessary to assure, that all recognition units are
tested for to get a 'not classifiable' signal when all and really
all local reset units are turned on.
*/
if ((winner_ptr == NULL) && (unit_ptr->Out.output >= max_out)) {
max_out = unit_ptr->Out.output;
winner_ptr = unit_ptr;
} /*if*/
} /*while*/
/* set activation and output of winner unit to 1.0, the one of the
other recognition units to 0.0
*/
topo_ptr = wta_layer;
while ((unit_ptr = *topo_ptr++) != NULL) {
if (unit_ptr != winner_ptr) {
unit_ptr->Out.output = 0.0;
} else {
unit_ptr->Out.output = winner_output;
} /*if*/
} /*while*/
return (winner_ptr);
} /* krart_get__winner () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
void krart_deleteTouchFlags (void)
{
register struct Unit *unit_ptr;
FOR_ALL_UNITS (unit_ptr) {
/* delete touch flags
*/
unit_ptr->flags &= ~UFLAG_REFRESH;
} /*FOR_ALL_UNITS*/
} /* krart_deleteTouchFlags () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
void krart_init_sorting (void)
{
register struct Unit *unit_ptr;
krart_deleteTouchFlags ();
FOR_ALL_UNITS (unit_ptr) {
/* init lln and lun
*/
unit_ptr->lln = unit_ptr->lun = 0;
} /*FOR_ALL_UNITS*/
} /* krart_init_sorting () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
int krart_get_NoOfInputUnits (void)
{
register struct Unit *unit_ptr;
int count = 0;
FOR_ALL_UNITS (unit_ptr) {
if (IS_INPUT_UNIT(unit_ptr)) {
count++;
} /*if*/
} /*FOR_ALL_UNITS*/
return (count);
} /* krart_get_NoOfInputUnits () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
bool krart_check_undeterminedUnits (void)
{
register struct Unit *unit_ptr;
FOR_ALL_UNITS (unit_ptr) {
if (unit_ptr->lln == 0) {
TOPO_MSG_UNDETERMINED_UNIT (unit_ptr);
return (TRUE);
} /*if*/
} /*FOR_ALL_UNITS*/
return (FALSE);
} /* krart_check_undeterminedUnits () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
void krart_save_inp_pat (TopoPtrArray topo_inp_ptr)
{
TopoPtrArray topo_ptr = topo_inp_ptr;
while (*topo_ptr != NULL) {
if (IS_INPUT_UNIT (*topo_ptr)) {
(*topo_ptr)->value_a = (*topo_ptr)->act;
} /*if*/
topo_ptr++;
} /*while*/
return;
} /* krart_save_inp_pat () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
bool krart_inp_pat_changed (TopoPtrArray topo_inp_ptr)
{
TopoPtrArray topo_ptr = topo_inp_ptr;
while (*topo_ptr != NULL) {
if ((IS_INPUT_UNIT(*topo_ptr)) && ((*topo_ptr)->value_a != (*topo_ptr)->act)) {
return (TRUE);
} /*if*/
topo_ptr++;
} /*FOR_ALL_UNITS*/
return (FALSE);
} /* krart_inp_pat_changed () */
/*___________________________________________________________________________*/